package com.sisgesbyte.dao.administracion;

import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import com.sisgesbyte.dao.beanDao.CategoriaProductoReq;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.dao.utilDao.CreaFiltroSqlString;
import com.sisgesbyte.data.entity.administracion.CategoriaProductoEntity;
import com.sisgesbyte.data.entity.comun.GenericEntity;
import com.sisgesbyte.data.util.AbstractFacade;

@Stateless
public class MantCategoriaProductoDaoImpl extends AbstractFacade<CategoriaProductoEntity> implements MantCategoriaProductoDao {

	@Inject
	private CreaFiltroSqlString creaFiltroSqlString;
	
	@PersistenceContext(unitName = "SigesSiscompPU")
	private EntityManager em;

	@Override
	protected EntityManager getEntityManager() {
		return em;
	}
	
	public MantCategoriaProductoDaoImpl(){
		super(CategoriaProductoEntity.class);
	}
	
	@Override
	public List<CategoriaProductoEntity> listarCategoriasProd(
			FiltrosSQLBean cadenaFiltros) {
		
		StringBuilder jpql = new StringBuilder();
		jpql.append("select id, nombre, descripcion, imagen, padre_id, nombre_padre,estado,nivel,url,item from ");
		jpql.append("(SELECT cp.id, cp.nombre, cp.descripcion, cp.imagen, cp.padre_id,  ");
		jpql.append("(select nombre from administracion.categoria_producto where id=cp.padre_id) as nombre_padre, ");
		jpql.append("cp.estado, cp.nivel,cp.url,cp.item FROM administracion.categoria_producto cp) cp ");
		// concatenamos el filtro
		if (cadenaFiltros != null) {
			StringBuilder filtro = new StringBuilder();
			filtro.append(creaFiltroSqlString.concatenar(cadenaFiltros));
			jpql.append(filtro.toString());
		}
		Query query = em.createNativeQuery(jpql.toString(), CategoriaProductoEntity.class);
		if (cadenaFiltros != null && cadenaFiltros.getListaValores() != null
				&& cadenaFiltros.getListaValores().size() > 0) {
			int num = 0;
			for (Object valor : cadenaFiltros.getListaValores()) {
				query.setParameter(++num, valor);
			}
		}
		List<CategoriaProductoEntity> ls = query.getResultList();

		return ls;
	}

	@Override
	public GenericEntity guardarCategoriasProd(CategoriaProductoReq request) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("select * from administracion.sp_registrar_categoriaprod(:nombre, :descripcion, :imagen, :padre_id, :nivel, :estado)");

		Query query = em
				.createNativeQuery(jpql.toString(), GenericEntity.class);
		query.setParameter("nombre", request.getNombre());
		query.setParameter("descripcion", request.getDescripcion());
		query.setParameter("padre_id", request.getPadre_id());
		query.setParameter("imagen", request.getImagen());
		query.setParameter("nivel", request.getNivel());
		query.setParameter("estado", request.getEstado());

		return (GenericEntity) query.getSingleResult();
	}

	@Override
	public GenericEntity actualizarCategoriasProd(CategoriaProductoReq request) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("select * from administracion.sp_actualizar_categoriaprod(:in_id, :in_nombre, :in_descripcion, :in_imagen, :in_padre_id, :in_estado, :in_nivel)");

		Query query = em
				.createNativeQuery(jpql.toString(), GenericEntity.class);
		query.setParameter("in_id", request.getId());
		query.setParameter("in_nombre", request.getNombre());
		query.setParameter("in_descripcion", request.getDescripcion());
		query.setParameter("in_imagen", request.getImagen());
		query.setParameter("in_padre_id", request.getPadre_id());
		query.setParameter("in_nivel", request.getNivel());
		query.setParameter("in_estado", request.getEstado());

		return (GenericEntity) query.getSingleResult();
	}

	@Override
	public GenericEntity eliminarCategoriasProd(int codCatProduc) {
		StringBuilder jpql = new StringBuilder();
		jpql.append("select * from administracion.sp_eliminar_categoriaprod(:id)");
		System.out.println("SP: "+jpql.toString());
		Query query = em.createNativeQuery(jpql.toString(), GenericEntity.class);
		query.setParameter("id", codCatProduc);
		System.out.println("codCatProduc: "+codCatProduc);
		return (GenericEntity) query.getSingleResult();
	}

}
